home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1999 Spring / macformat-077.iso / Shareware Plus / Development / SpriteWorld 2.2 / SpriteWorld Examples / SpriteTest / Application.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-18  |  11.3 KB  |  558 lines  |  [TEXT/CWIE]

  1. ///--------------------------------------------------------------------------------------
  2. //    Application.c
  3. //
  4. // By: Tony Myles
  5. //
  6. // Extensive modifications by Karl Bunker
  7. //
  8. ///--------------------------------------------------------------------------------------
  9.  
  10.  
  11. #ifndef __GESTALTEQU__
  12. #include <Gestalt.h>
  13. #endif
  14.  
  15. #ifndef __PALETTES__
  16. #include <Palettes.h>
  17. #endif
  18.  
  19.  
  20. #include <SWIncludes.h>            // Automatically include all SpriteWorld.h files
  21. #include <SWGameUtils.h>
  22. #include <SWDialogUtils.h>
  23. #include <SWApplication.h>    
  24.  
  25. #if __MWERKS__
  26. #include <profiler.h>
  27. #endif
  28.  
  29. #include "Application.h"
  30. #include "SpriteTest.h"
  31. #include "About.h"
  32.  
  33. #define kWindowInsetH 0     // modify to test windows smaller than 640x480 screen size
  34. #define kWindowInsetV 0
  35.  
  36. SpriteTestPtr             gSpriteTestP = NULL;
  37.  
  38. static Boolean             gDone = false;
  39. static Boolean             gInBackGround = false;
  40. static WindowPtr         gWindowP = NULL;
  41.  
  42. extern Boolean            gGlobesVisible;
  43. extern Boolean            gTitleVisible;
  44. extern Boolean            gCollisionDetection;
  45.  
  46.  
  47. /******************** main ********************/
  48. void main(void)
  49. {
  50. /*
  51.     ProfilerInit( collectDetailed, bestTimeBase, 100, 40 );
  52.     ProfilerSetStatus( false );
  53. */
  54.     Initialize(2);
  55.  
  56.     CreateMenuBar();
  57.     CreateWindow();
  58.  
  59.     EnterApplication();
  60.     ServiceEvents();
  61.     
  62.     ExitApplication();
  63.     ExitToShell();
  64. }
  65.  
  66.  
  67. /******************** CreateMenuBar ********************/
  68. void CreateMenuBar(void)
  69. {
  70.     Handle menuBarH;
  71.  
  72.     menuBarH = GetNewMBar(kMenuBarResID);
  73.  
  74.     if (menuBarH != NULL)
  75.     {
  76.         SetMenuBar(menuBarH);
  77.         AppendResMenu(GetMenuHandle(kAppleMenuID), 'DRVR');
  78.         DrawMenuBar();
  79.     }
  80.     else
  81.     {
  82.         CantFindResource();
  83.     }
  84. }
  85.  
  86.  
  87. /******************** CreateWindow ********************/
  88. void CreateWindow(void)
  89. {
  90.     Rect        monitorRect;
  91.     short        windowInsetH = kWindowInsetH;
  92.     short        windowInsetV = kWindowInsetV;
  93.     
  94.     
  95.     gWindowP = GetNewCWindow(kMyWindowResID, NULL, (WindowPtr)-1L);
  96.     
  97.     if (gWindowP != NULL)
  98.     {
  99.         monitorRect = (*GetMainDevice())->gdRect;
  100.         
  101.         SizeWindow(gWindowP, (monitorRect.right-monitorRect.left), 
  102.                     (monitorRect.bottom-monitorRect.top), false);
  103.                     
  104.         if ( (monitorRect.right-monitorRect.left) > 640 )
  105.             windowInsetH += ((monitorRect.right-monitorRect.left) - 640)/2;
  106.         if ( (monitorRect.bottom-monitorRect.top) > 480 )
  107.             windowInsetV += ((monitorRect.bottom-monitorRect.top) - 480)/2;
  108.         
  109.         SizeWindow(gWindowP, (monitorRect.right-monitorRect.left) - (windowInsetH*2), 
  110.                     (monitorRect.bottom-monitorRect.top) - (windowInsetV*2), false);
  111.         
  112.         MoveWindow(gWindowP, monitorRect.left + windowInsetH, 
  113.             monitorRect.top + windowInsetV, false);
  114.     }
  115.     else
  116.     {
  117.         CantFindResource();
  118.     }
  119. }
  120.  
  121.  
  122. /******************** EnterApplication ********************/
  123. void EnterApplication(void)
  124. {
  125.     OSErr    err = noErr;
  126.     
  127.         
  128.     err = SWEnterSpriteWorld();
  129.     FatalError(err);
  130.  
  131.     err = SetupSWStuff(&gSpriteTestP, (CWindowPtr)gWindowP);
  132.     FatalError(err);
  133.  
  134.     ShowWindow(gWindowP);
  135.     UpdateSpriteTest(gSpriteTestP, gWindowP);
  136.     ValidRect(&gWindowP->portRect);
  137. }
  138.  
  139.  
  140. /******************** ExitApplication ********************/
  141. void ExitApplication(void)
  142. {
  143.     
  144.     DisposeSWStuff(gSpriteTestP);
  145.     SWExitSpriteWorld();
  146.     
  147.     DisposeWindow(gWindowP);
  148. }
  149.  
  150.  
  151. /******************** ServiceEvents ********************/
  152. void ServiceEvents(void)
  153. {
  154.     Boolean haveEvent;
  155.     EventRecord event;
  156.     long sleepTime;
  157.  
  158.     while (!gDone)
  159.     {
  160.         sleepTime = gInBackGround ? kBackGroundSleepTime : kForeGroundSleepTime;
  161.         haveEvent = WaitNextEvent(everyEvent, &event, sleepTime, NULL);
  162.  
  163.         if (haveEvent)
  164.         {
  165.             DispatchEvent(&event);
  166.         }
  167.         else
  168.         {
  169.             HandleNullEvent();
  170.         }
  171.     }
  172. }
  173.  
  174.  
  175. /******************** DispatchEvent ********************/
  176. void DispatchEvent(
  177.     EventRecord* event)
  178. {
  179.     switch(event->what)
  180.     {
  181.         case mouseDown:
  182.             HandleMouseEvent(event);
  183.             break;
  184.         case mouseUp:
  185.             break;
  186.         case keyUp:
  187.             break;
  188.         case keyDown:
  189.         case autoKey:
  190.             HandleKeyEvent((char)(event->message & charCodeMask), event->modifiers);
  191.             break;
  192.         case updateEvt:
  193.             HandleUpdateEvent((WindowPtr)event->message);
  194.             break;
  195.         case diskEvt:
  196.             break;
  197.         case activateEvt:
  198.             break;
  199.         case osEvt:
  200.             HandleOSEvent(event->message);
  201.             break;
  202.         case kHighLevelEvent:
  203.             break;
  204.         default:
  205.         break;
  206.     }
  207. }
  208.  
  209.  
  210. /******************** HandleMouseEvent ********************/
  211. void HandleMouseEvent(
  212.     EventRecord* event)
  213. {
  214.     WindowPtr whichWindow;
  215.     short partCode;
  216.  
  217.     partCode = FindWindow(event->where, &whichWindow);
  218.  
  219.     switch (partCode)
  220.     {
  221.         case inDesk:        
  222.             break;
  223.         case inMenuBar:
  224.             AdjustMenuItems();
  225.             HandleMenuCommand(MenuSelect(event->where));
  226.             break;
  227.         case inSysWindow:
  228.             SystemClick(event, whichWindow);
  229.             break;
  230.         case inContent:
  231.             RemoveClickedSprite( gSpriteTestP );
  232.             break;
  233.         case inDrag:
  234.             break;
  235.         case inGrow:
  236.             break;
  237.         case inGoAway:
  238.             break;
  239.         case inZoomIn:
  240.         case inZoomOut:
  241.             break;
  242.         default:            
  243.             break;
  244.     }
  245. }
  246.  
  247.  
  248. /******************** HandleKeyEvent ********************/
  249. void HandleKeyEvent(
  250.     char key,
  251.     short modifiers)
  252. {
  253.     
  254.     if ((modifiers & cmdKey) != 0)
  255.     {
  256.         AdjustMenuItems();
  257.         HandleMenuCommand(MenuKey(key));
  258.     }
  259.     else
  260.     {
  261.             // if the spacebar is hit, fill the screen with black
  262.             // useful for debugging purposes
  263.         if (key == ' ')
  264.         {
  265.             FillRect(&gSpriteTestP->spriteWorldP->windowFrameP->frameRect, &qd.black);
  266.         }
  267.     }
  268. }
  269.  
  270.  
  271. /******************** HandleUpdateEvent ********************/
  272. void HandleUpdateEvent(
  273.     WindowPtr updateWindowP)
  274. {
  275.     GDHandle        windowGDH;
  276.     OSErr            err; 
  277.     
  278.     if (updateWindowP == gWindowP)
  279.     {
  280.         SetPort(updateWindowP);
  281.         windowGDH = GetMaxDevice( &updateWindowP->portRect );
  282.         
  283.             // has the depth been changed?
  284.         if ( GetGDeviceDepth(windowGDH) != gSpriteTestP->spriteWorldP->pixelDepth )    
  285.         {    // if so, rebuild SpriteWorld
  286.             DisposeSWStuff(gSpriteTestP);
  287.             err = SetupSWStuff(&gSpriteTestP, (CWindowPtr)gWindowP);
  288.             FatalError(err);
  289.         }
  290.         BeginUpdate(updateWindowP);
  291.  
  292.         UpdateSpriteTest(gSpriteTestP, updateWindowP);
  293.  
  294.         EndUpdate(updateWindowP);
  295.     }
  296. }
  297.  
  298.  
  299. /******************** HandleOSEvent ********************/
  300. void HandleOSEvent(
  301.     long message)
  302. {
  303.     if ((message >> 24) == suspendResumeMessage)
  304.     {
  305.         if ((message & resumeFlag) != 0)
  306.         {
  307.             gInBackGround = false;
  308.         }
  309.         else
  310.         {
  311.             gInBackGround = true;
  312.         }
  313.     }
  314. }
  315.  
  316.  
  317. /******************** HandleNullEvent ********************/
  318. void HandleNullEvent(void)
  319. {
  320.     SpriteTestIdle(gSpriteTestP);
  321. }
  322.  
  323.  
  324. /******************** HandleMenuCommand ********************/
  325. void HandleMenuCommand(
  326.     long menuItemIdentifier)
  327. {
  328.     short menuIdent = HiWord(menuItemIdentifier);
  329.     short menuItem = LoWord(menuItemIdentifier);
  330.  
  331.     switch (menuIdent)
  332.     {
  333.         case kAppleMenuID:
  334.             HandleAppleMenuCommand(menuItem);
  335.             break;
  336.  
  337.         case kFileMenuID:
  338.             HandleFileMenuCommand(menuItem);
  339.             break;
  340.  
  341.         case kEditMenuID:
  342.             HandleEditMenuCommand(menuItem);
  343.             break;
  344.  
  345.         case kSpriteMenuID:
  346.             HandleSpriteMenuCommand(menuItem);
  347.             break;
  348.  
  349.         case kTestMenuID:
  350.             HandleTestMenuCommand(menuItem);
  351.             break;
  352.     }
  353.     HiliteMenu(0);
  354. }
  355.  
  356.  
  357. /******************** HandleAppleMenuCommand ********************/
  358. void HandleAppleMenuCommand(
  359.     short menuItem)
  360. {
  361.     Str255 deskAccName;
  362.  
  363.     switch (menuItem)
  364.     {
  365.         case kAboutItem:
  366.             DisplayAboutBox();
  367.             break;
  368.  
  369.         default:
  370.             GetMenuItemText(GetMenuHandle(kAppleMenuID), menuItem, deskAccName);
  371.             OpenDeskAcc(deskAccName);
  372.             break;
  373.     }
  374. }
  375.  
  376.  
  377. /******************** HandleFileMenuCommand ********************/
  378. void HandleFileMenuCommand(
  379.     short menuItem)
  380. {
  381.     switch (menuItem)
  382.     {
  383.         case kQuitItem:
  384.             gDone = true;
  385.             break;
  386.     }
  387. }
  388.  
  389. /******************** HandleEditMenuCommand ********************/
  390. void HandleEditMenuCommand(
  391.     short menuItem)
  392. {
  393.     (void)SystemEdit(menuItem);
  394. }
  395.  
  396.  
  397. /******************** HandleSpriteMenuCommand ********************/
  398. void HandleSpriteMenuCommand(
  399.     short menuItem)
  400. {
  401.     switch (menuItem)
  402.     {
  403.         case kCreateSpriteItem:
  404.             HandleCreateSpriteCommand(gSpriteTestP);
  405.             break;
  406.  
  407.         case kHideTitleItem:
  408.             HandleSpriteTestTitleCommand(gSpriteTestP);
  409.             break;
  410.  
  411.         case kHideBallsItem:
  412.             HandleBouncingBallsCommand(gSpriteTestP);
  413.             break;
  414.     }
  415. }
  416.  
  417.  
  418. /******************** HandleTestMenuCommand ********************/
  419. void HandleTestMenuCommand(
  420.     short menuItem)
  421. {
  422.     switch (menuItem)
  423.     {
  424.         case kRunTestItem:
  425.             RunTheTest( gSpriteTestP );
  426.         break;
  427.         
  428.         case kSetUpTestItem:
  429.             SetUpTestDialog( gSpriteTestP );
  430.         break;
  431.         
  432.         case kCollisionDetectionItem:
  433.             gCollisionDetection = !gCollisionDetection;
  434.         break;
  435.         
  436.         case kMonitorDepthItem:
  437.             MonitorDepthDialog();
  438.         break;
  439.     }
  440. }
  441.  
  442.  
  443. /******************** AdjustMenuItems ********************/
  444. void AdjustMenuItems(void)
  445. {
  446.     MenuHandle tempMenuH;
  447.  
  448.         // adjust the sprite menu
  449.     tempMenuH = GetMenuHandle(kSpriteMenuID);
  450.  
  451.     CheckItem(tempMenuH, kHideTitleItem, gTitleVisible);
  452.     CheckItem(tempMenuH, kHideBallsItem, gGlobesVisible);
  453.  
  454.         // adjust the test menu
  455.     tempMenuH = GetMenuHandle(kTestMenuID);
  456.     
  457.     CheckItem(tempMenuH, kCollisionDetectionItem, gCollisionDetection);
  458.     
  459. }
  460.  
  461.  
  462. /******************** MonitorDepthDialog ********************/
  463. void MonitorDepthDialog(void)
  464. {
  465.     GrafPtr            savePort;
  466.     DialogPtr        theDialog;
  467.     short            itemHit;
  468.     GDHandle        windowGDH;
  469.     short            originalDepth, requestedDepth;
  470.     Boolean            done = false;
  471.     OSErr            err = noErr;
  472.     
  473.     
  474.     GetPort( &savePort );
  475.         
  476.     theDialog = GetNewDialog(kMonitorDepthResID, nil, (WindowPtr)-1L);
  477.         
  478.     SetDialogDefaultItem( theDialog, ok );
  479.     SetDialogCancelItem( theDialog, cancel );
  480.     
  481.     windowGDH = GetMaxDevice( &theDialog->portRect );
  482.     
  483.     originalDepth = requestedDepth = GetGDeviceDepth(windowGDH);
  484.             
  485.         // Check if monitor can display these depths
  486.     SetDItemHilite( theDialog, k1BitDepthButton, HasDepth(windowGDH, 1, 0, 0) );
  487.     SetDItemHilite( theDialog, k4BitDepthButton, HasDepth(windowGDH, 4, 0, 0) );
  488.     SetDItemHilite( theDialog, k8BitDepthButton, HasDepth(windowGDH, 8, 0, 0) );
  489.     SetDItemHilite( theDialog, k16BitDepthButton, HasDepth(windowGDH, 16, 0, 0) );
  490.     SetDItemHilite( theDialog, k32BitDepthButton, HasDepth(windowGDH, 32, 0, 0) );
  491.     
  492.     SetMonitorDepthButtons( theDialog, originalDepth );
  493.     
  494.     ShowWindow( theDialog );
  495.     
  496.     while ( !done )
  497.     {    
  498.         ModalDialog( nil, &itemHit );
  499.         switch( itemHit )
  500.         {
  501.             case k1BitDepthButton:
  502.                 requestedDepth = 1;
  503.                 SetMonitorDepthButtons( theDialog, requestedDepth );
  504.             break;
  505.             case k4BitDepthButton:
  506.                 requestedDepth = 4;
  507.                 SetMonitorDepthButtons( theDialog, requestedDepth );
  508.             break;
  509.             case k8BitDepthButton:
  510.                 requestedDepth = 8;
  511.                 SetMonitorDepthButtons( theDialog, requestedDepth );
  512.             break;
  513.             case k16BitDepthButton:
  514.                 requestedDepth = 16;
  515.                 SetMonitorDepthButtons( theDialog, requestedDepth );
  516.             break;
  517.             case k32BitDepthButton:
  518.                 requestedDepth = 32;
  519.                 SetMonitorDepthButtons( theDialog, requestedDepth );
  520.             break;
  521.             case ok:
  522.             case cancel:
  523.                 done = true;
  524.             break;
  525.         }
  526.     }
  527.     DisposeDialog( theDialog );
  528.     SetPort( savePort );
  529.     
  530.     if ( itemHit == ok )
  531.     {
  532.         DisposeSWStuff(gSpriteTestP);
  533.             // can we do colors?
  534.         if ( HasDepth(windowGDH, requestedDepth, 1, 1) )
  535.             (void)SetDepth( windowGDH, requestedDepth, 1, 1 );
  536.             // if not, settle for greyscale
  537.         else
  538.             (void)SetDepth( windowGDH, requestedDepth, 1, 0 );
  539.         
  540.         err = SetupSWStuff(&gSpriteTestP, (CWindowPtr)gWindowP);
  541.         FatalError(err);
  542.     }
  543. }
  544.  
  545.  
  546. /******************** SetMonitorDepthButtons ********************/
  547. void SetMonitorDepthButtons(
  548.     DialogPtr theDialog,
  549.     short theDepth)
  550. {
  551.     SetControlValue( (ControlHandle)GetDItemHandle(theDialog, k1BitDepthButton), (theDepth == 1) );
  552.     SetControlValue( (ControlHandle)GetDItemHandle(theDialog, k4BitDepthButton), (theDepth == 4) );
  553.     SetControlValue( (ControlHandle)GetDItemHandle(theDialog, k8BitDepthButton), (theDepth == 8) );
  554.     SetControlValue( (ControlHandle)GetDItemHandle(theDialog, k16BitDepthButton), (theDepth == 16) );
  555.     SetControlValue( (ControlHandle)GetDItemHandle(theDialog, k32BitDepthButton), (theDepth == 32) );
  556. }
  557.  
  558.